package com.cskaoyan.javase._1extends._10final._3variable._2member;

/**
 * final修饰成员变量,表示成员常量,仍然属于对象,仍然创建对象,才能够访问.
 * 语法:
 * [访问权限修饰符] final 数据类型 成员常量名;
 *
 * 成员常量的取值,既然是常量,它的取值一旦确定就不可更改,
 *      所以语法上要求它的取值,不能依赖于默认初始化的默认值.
 * 那么除开默认初始化,成员变量的赋值还有哪些手段?
 *      1.显式赋值
 *      2.构造代码块赋值
 *      3.构造器赋值
 *
 * 成员常量的取值,必须在创建对象过程中明确.
 * 以上三种赋值方式,必须选择其一,也只能选择其一.常量的赋值,最多只能赋值一次.
 *
 * 注意,当选择构造器赋值时,需要保证每一个构造器都要能够给成员常量赋值
 * 因为一个构造器就是一种new对象的方式
 *
 * 思考:
 *      如果需要一个真正意义上的常量,那么成员常量能够满足需求吗?
 *      显然不行,成员常量属于对象,每创建一个对象,成员常量的取值都有可能不同.
 *      所以成员常量不是一个真正意义上的常量
 *      如果需要真正意义上的常量,那就需要使用final修饰的静态成员变量,静态成员常量是一个真正意义上的常量.
 *
 * @since 14:57
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student();
        System.out.println(s.age);
        // s.age = 28;

        Student s2 = new Student(28);
        System.out.println(s2.age);
    }
}

class Student {
    // 定义成员常量
    // Variable 'name' might not have been initialized
    // final String name;
    final int age;
    /*{
        age = 28;
    }*/
    public Student(int age) {
        this.age = age;
    }
    public Student() {
        age = 18;
    }
}
